package cn.good.yan.service.t5;

import java.util.concurrent.TimeUnit;

/**
 * 5. volatile
 * 可见性、有序性、不是原子性
 *
 * @author shengren.yan
 * @create 2024-03-28
 */
public class VolatileDemo1 {

    // 不使用 volatile，会出现死循环，当t1线程一直循环，其他线程更改flag，t1线程不知道flag变量已改变，（不可见性）
    //static boolean flag = true;

    // 使用 volatile，不会出现死循环，当t1线程一直循环，其他线程更改flag，t1线程知道flag变量已改变，（可见性）
    static volatile boolean flag = true;

    public static void main(String[] args) {
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "\t -----come in");
            while (flag) {

            }
            System.out.println(Thread.currentThread().getName() + "\t -----flag被设置为false，程序停止");
        }, "t1").start();

        //暂停几秒钟线程
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        flag = false;

        System.out.println(Thread.currentThread().getName() + "\t 修改完成flag: " + flag);

    }
}
